package com.ilxqx.generator.parser.impl;

import com.google.common.collect.Lists;
import com.ilxqx.generator.enumeration.ConstraintKeyEnum;
import com.ilxqx.generator.key.ConstraintKey;
import com.ilxqx.generator.parser.Rules;
import com.ilxqx.generator.parser.TableField;
import com.ilxqx.generator.util.ConvertUtils;
import lombok.Setter;

import java.util.List;
import java.util.Objects;

/**
 * 表字段实现类
 * @author venus
 */
@Setter
public class TableFieldImpl implements TableField {

    /**
     * 字段名
     */
    private String fieldName;

    /**
     * 字段类型
     */
    private String fieldType;

    /**
     * 原始类型(数据库类型)
     */
    private String sqlType;

    /**
     * 字段长度
     */
    private int fieldSize;

    /**
     * 是否可空
     */
    private boolean nullable;

    /**
     * 是否非负
     */
    private boolean unsigned;

    /**
     * 字段注释
     */
    private String fieldComment;

    /**
     * 限制键
     */
    private List<ConstraintKey> keys;

    /**
     * 字段规则
     */
    private Rules rules;

    public TableFieldImpl() {
        this.keys = Lists.newArrayList();
    }

    public void addKey(ConstraintKey constraintKey) {
        this.keys.add(constraintKey);
    }

    /**
     * 获取字段名
     *
     * @return 字段名
     */
    @Override
    public String getName() {
        return this.fieldName;
    }

    /**
     * 获取字段类型
     *
     * @return 字段类型
     */
    @Override
    public String getType() {
        return this.fieldType;
    }

    /**
     * 获取字段的原始类型
     *
     * @return 字段类型
     */
    @Override
    public String getSqlType() {
        return this.sqlType;
    }

    /**
     * 设置原始类型
     *
     * @param type 类型
     */
    @Override
    public void setSqlType(String type) {
        this.sqlType = type;
    }

    /**
	 * 设置类型
	 *
	 * @param type 类型
	 */
	@Override
	public void setType(String type) {
		this.fieldType = type;
	}

	/**
     * 获取字段长度
     *
     * @return 字段长度
     */
    @Override
    public int getSize() {
        return this.fieldSize;
    }

    /**
     * 该字段是否可空
     *
     * @return bool
     */
    @Override
    public boolean isNullable() {
        return this.nullable;
    }

    /**
     * 该字段是否非负
     *
     * @return bool
     */
    @Override
    public boolean isUnsigned() {
        return this.unsigned;
    }

    /**
     * 判断该字段是否是主键
     *
     * @return bool
     */
    @Override
    public boolean isPrimaryKey() {
        return this.keys.stream().anyMatch(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.PRIMARY_KEY));
    }

    /**
     * 判断该字段是否是唯一键
     *
     * @return bool
     */
    @Override
    public boolean isUniqueKey() {
        return this.keys.stream().anyMatch(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.UNIQUE_KEY));
    }

    /**
     * 判断该字段是否是可重复键（索引）
     *
     * @return bool
     */
    @Override
    public boolean isMultipleKey() {
        return this.keys.stream().anyMatch(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.MULTIPLE_KEY));
    }

    @Override
    public boolean isForeignKey() {
        return this.keys.stream().anyMatch(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.FOREIGN_KEY));
    }

    /**
     * 获取主键
     *
     * @return 主键
     */
    @Override
    public ConstraintKey getPrimaryKey() {
        return this.keys.stream().filter(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.PRIMARY_KEY)).findFirst().orElse(null);
    }

    /**
     * 获取唯一键
     *
     * @return 唯一键
     */
    @Override
    public ConstraintKey getUniqueKey() {
        return this.keys.stream().filter(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.UNIQUE_KEY)).findFirst().orElse(null);
    }

    /**
     * 获取可索引键
     *
     * @return 索引键
     */
    @Override
    public ConstraintKey getMultipleKey() {
        return this.keys.stream().filter(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.MULTIPLE_KEY)).findFirst().orElse(null);
    }

    @Override
    public ConstraintKey getForeignKey() {
        return this.keys.stream().filter(key -> Objects.equals(key.getKeyType(), ConstraintKeyEnum.FOREIGN_KEY)).findFirst().orElse(null);
    }

    /**
     * 获取字段备注
     *
     * @return 备注
     */
    @Override
    public String getComment() {
        return this.fieldComment;
    }

    /**
     * 获取备注中的规则
     *
     * @return 规则对象
     */
    @Override
    public Rules getRules() {
        return this.rules;
    }

    /**
     * 获取驼峰命名
     *
     * @return 驼峰命名
     */
    @Override
    public String getCamelName() {
        return ConvertUtils.dashToCamel(this.fieldName);
    }

    /**
     * 获取小写驼峰命名
     *
     * @return 小写驼峰命名
     */
    @Override
    public String getLowerCamelName() {
        return ConvertUtils.dashToFirstLowerCamel(this.fieldName);
    }

    /**
     * 获取中划线命名
     *
     * @return 中划线命名
     */
    @Override
    public String getKebabName() {
        return ConvertUtils.dashToKebab(this.fieldName);
    }

}
